02. git add

移至正确的项目

如果你一直跟着操作,那么现在你的计算机中,应该在两个目录下有 git 项目:

  • new-git-project - 使用 git init 转换为 git 仓库的空目录

  • course-git-blog-project - 使用 git clone 获得的现有博客项目

为了避免与已有的 commit 产生混淆,我们将向 new-git-project 仓库提交 commit。

在终端上,确保使用 cd 命令转到 new-git-project 目录中。如果你没有 new-git-project 目录,现在创建一个。位于该目录中后,运行 git init 命令。如果你之前已经运行了 git init ,没关系。多次运行 git init 不会导致任何问题,因为它只是重新初始化 Git 目录。

正确设置

Task Description:

现在该确保我们的配置是一样的了:

Task List:

Task Feedback:

很棒!

你的终端应该如下图所示:

_位于 new-git-project 目录中的终端。_

位于 new-git-project 目录中的终端。

状态!状态!状态!

我已经多次提到,但是还是要提下, git status 命令在这节课将非常有用。你应该在任何一个其他 git 命令之前和之后运行 git status 命令。

我们立即运行该命令吧!

_终端显示了 `git status` 命令的输出结果。_

终端显示了 git status 命令的输出结果。

git status 输出总结

以下是输出:

On branch master

Initial commit

nothing to commit (create/copy files and use "git add" to track)

注意最后一行 – nothing to commit (create/copy files and use "git add" to track) 。注意到它推荐使用的 git add 命令了吗?这很有帮助! git status 的输出结果将给出下一步应该怎么做的建议或提示。

我们根据反馈的建议操作,并创建一些文件。

创建 HTML 文件

首先,创建一个叫做 index.html 的文件,并添加一些起始代码:

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Blog Project</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <link rel="stylesheet" href="css/app.css">
</head>
<body>

    <script src="js/app.js"></script>
</body>
</html>

注意,代码引用了 CSS 文件和 JavaScript 文件。

现在创建这些 CSS 和 JavaScript 文件。你可以让这两个文件留空。稍后我们将向文件中添加内容。

验证项目设置

Task Description:

在继续之前,确保我们的设置相同。完成后请清点一下这些状态进行确认:

Task List:

Task Feedback:

很棒!

快速检查 git 状态

我们刚刚通过添加了文件和内容对仓库进行了几个更改。现在该快速检查下 git 的状态了:

          $ git status

我的终端显示了以下内容:

_终端在新加入的"Untracked files"部分显示了 index.html 文件,以及 css 与 js 文件夹。_

终端在新加入的"Untracked files"部分显示了 index.html 文件,以及 css 与 js 文件夹。

整体回顾

很酷吧?我们尚未对 git 执行任何特殊操作,但是它已经在观察这个目录(因为它是 git 项目),并且知道我们创建了几个新的文件。 git status 命令的输出同样十分简洁地告诉我们 git 没有跟踪这些文件。

我们快速回顾一下正在进行的操作以及将要执行的操作:

  • 我们新建了几个希望 git 开始跟踪的文件

  • 为了让 git 能跟踪文件,需要将该文件提交到仓库中

  • 要提交文件,需要将该文件放入暂存区

  • 可以使用 git add 命令将文件从工作目录移到暂存区

  • 工作目录中目前有三个未跟踪文件

  • index.html

  • css 目录下的 app.css

  • js 目录下的 app.js

要将所有文件提交到仓库中,首先需要将这些文件从工作目录移到暂存区。我们将使用 git add 命令将这三个文件移到暂存区。

_未跟踪的 HTML、CSS 和 JavaScript 文件从工作目录添加到了暂存区。_

未跟踪的 HTML、CSS 和 JavaScript 文件从工作目录添加到了暂存区。

暂存文件

是时候行动了!在终端上运行以下命令,使用 git add index.html 添加到暂存区:

$ git add index.html

注意:我们仅添加了 index.html 文件。稍后我们将添加 CSS 和 JavaScript 文件。

_终端正在输入命令"git add index.html"以将该文件添加到暂存区。_

终端正在输入命令"git add index.html"以将该文件添加到暂存区。

运行 git add 命令没有任何输出(同样也没有错误)。如何让 git 告诉我们它执行了什么操作以及添加的 index.html 文件发生了什么呢? git status 就可以告诉我们这些信息。你可能对我一直在强调 git status 命令的重要性开始感到厌烦了,但是它是非常重要的命令,特别是在你对版本控制/命令行工具不是非常熟练的时期,更要注重该命令。

我们来看看项目的状态:

 $ git status

这是我获得的输出结果:

_终端运行 `git status` 命令的结果如下。它显示 index.html 现在位于"Changes to be committed"分类下。_

终端运行 git status 命令的结果如下。它显示 index.html 现在位于"Changes to be committed"分类下。

Changes to be committed

输出结果中现在出现了全新的区域:"Changes to be committed"区域!这一新的"Changes to be committed"区域显示了位于暂存区的文件!目前只显示了 index.html 文件,因此暂存区只有这个文件。继续这一思路,如果我们现在提交 commit,则只有 index.html 文件会被提交。

提示:你注意到"Changes to be committed"下方的帮助文本了吗?它提示 (use "git rm --cached <file>..." to unstage) ,也就是当你不小心运行了 git add 并提供了错误文件,它会提示你应该怎么操作。

顺便提下, git rm --cached 与 shell 的 rm 命令不同。 git rm --cached 不会破坏任何属于你的文件,它只是从暂存区删掉了文件。

此外,帮助文本中出现了"unstage"(撤消暂存)字眼。将文件从工作目录移到暂存区叫做"staging"(暂存)。如果已移动文件,则叫做"staged"(已暂存)。从暂存区将文件移回工作目录将"unstage"(撤消暂存)。如果你阅读的文档中提示“stage the following files”,则表明你应该使用 git add 命令。

暂存剩余的文件

index.html 文件已暂存。我们再暂存另外两个文件。现在我们可以运行以下命令:

$ git add css/app.css js/app.js

但是要输入的内容好多啊。我们可以使用一个特殊的命令行字符:

句点 .

句点指代当前目录,可以用来表示所有文件和目录(包括所有嵌套文件和目录!)。

      ```bash
      $ git add css/app.css js/app.js
      # 等同于
      $ git add .
      ```

唯一要注意的是,你可能会不小心包含多余的文件。现在,我们希望同时暂存 css/app.css js/app.js ,因此运行该命令没问题。现在假设你向 img 目录添加了一些图片,但是暂时不想暂存这些图片。运行 git add . 将暂存这些图片。如果你暂存了不想暂存的文件, git status 会告诉你撤消暂存需要用到的命令。

暂存剩余的文件

我们使用以下简写命令暂存剩余的文件:

$ git add .

然后运行 git status

_终端显示 index.html、css/app.css 和 js/app.js 已被暂存。_

终端显示 index.html、css/app.css 和 js/app.js 已被暂存。

git add 小结

git add 命令用于将文件从工作目录移到暂存区。

$ git add <file1> <file2> … <fileN>

此命令:

  • 可接受多个文件名(用空格分隔)

  • 此外,可以使用句点 . 来代替文件列表,告诉 git 添加当前目录至暂存区(以及所有嵌套文件)